package tio.study.helloworld.client.starter;

import org.tio.client.ClientChannelContext;
import org.tio.client.ReconnConf;
import org.tio.client.TioClient;
import org.tio.client.TioClientConfig;
import org.tio.client.intf.TioClientHandler;
import org.tio.client.intf.TioClientListener;
import org.tio.core.Node;
import org.tio.core.Tio;
import tio.study.helloworld.client.handle.MyClientTioHandler;
import tio.study.helloworld.client.listener.MyClientTioListener;
import tio.study.helloworld.common.consts.Const;
import tio.study.helloworld.common.packet.HelloPacket;

/**
 * 客户端启动类
 *
 * @author lizhou
 */
public class ClientStarter {

    /**
     * 构建服务器节点
     */
    public static Node serverNode = new Node(Const.SERVER, Const.PORT);

    /**
     * handler, 包括编码、解码、消息处理
     */
    public static TioClientHandler clientTioHandler = new MyClientTioHandler();

    /**
     * 事件监听器，可以为null，但建议自己实现该接口，可以参考showcase了解些接口
     */
    public static TioClientListener clientTioListener = new MyClientTioListener();

    /**
     * 断链后自动连接的，不想自动连接请设为null，间隔5秒，重试10次
     */
    private static ReconnConf reconnConf = new ReconnConf(3000L, 10);

    /**
     * 一组连接共用的上下文对象
     */
    public static TioClientConfig tioClientConfig = new TioClientConfig(clientTioHandler, clientTioListener, reconnConf);

    /**
     * 客户端入口
     */
    public static TioClient tioClient = null;

    /**
     * 客户端TCP连接上下文
     */
    public static ClientChannelContext clientChannelContext = null;

    /**
     * 启动程序入口
     */
    public static void main(String[] args) throws Exception {
        // 服务名称
        tioClientConfig.setName("T-io Client");
        // 心跳超时时间
        tioClientConfig.setHeartbeatTimeout(Const.TIMEOUT);
        tioClient = new TioClient(tioClientConfig);
        // 连接到服务器
        clientChannelContext = tioClient.connect(serverNode);
        // 连上后，给服务端发条消息
        sendMsg();
    }


    /**
     * 发送消息
     *
     * @throws Exception
     */
    private static void sendMsg() throws Exception {
        HelloPacket packet = new HelloPacket();
        packet.setBody(("hello world").getBytes(HelloPacket.CHAR_SET));
        Tio.send(clientChannelContext, packet);
    }

}
